WebRequest

Die Funktion sendet eine HTTP-Anfrage an den angegebenen Server. Es gibt zwei Varianten der Funktion:

1. Für das Senden einer einfachen Anfragevom Typ "Schlüssel=Wert" mit dem Header Content-Type: application/x-www-form-urlencoded.

int  WebRequest(
   const string      method,           // HTTP-Methode
   const string      url,              // URL-Adresse
   const string      cookie,           // Cookie
   const string      referer,          // Referer
   int               timeout,          // Timeout
   const char        &data[],          // Array des Body einer HTTP-Nachricht
   int               data_size,        // Größe des data[]-Arrays in Bytes
   char              &result[],        // Array mit den Daten der Serverantwort
   string            &result_headers   // Headers der Serverantwort
   );

2. Für das Senden einer Anfrage beliebigen Typs mit einem eigenen Set von Headers für eine flexiblere Interaktion mit verschiedenen Webservices.

int  WebRequest(
   const string      method,           // HTTP-Methode
   const string      url,              // URL-Adresse
   const string      headers,          // Headers 
   int               timeout,          // Timeout
   const char        &data[],          // Array des Body einer HTTP-Nachricht
   char              &result[],        // Array mit den Daten der Serverantwort
   string            &result_headers   // Headers der Serverantwort
   );

Parameter

method

[in]  HTTP-Methode.

url

[in]  URL-Adresse

headers

[in]  Headers vom Type "Schlüssel=Wert", die durch Zeilenumbruch "\r\n" getrennt sind.

cookie

[in]  Wert von Cookie.

referer

[in]  Wert von Referer der HTTP-Anfrage.

timeout

[in]  Timeout in Millisekunden.

data[]

[in]  Array für die Daten des Body von HTTP-Nachrichten.

data_size

[in]  Größe des data[]-Arrays.

result[]

[out]  Array mit den Daten der Serverantwort

result_headers

[out]  Headers der Serverantwort.

Rückgabewert

Antwortcode des HTTP-Servers oder -1 im Fehlerfall.

Hinweis

Um die WebRequest-Funktion zu verwenden, schreiben Sie die Serveradressen in die Liste der erlaubten URLs auf der Registerkarte "Experten" im Fenster "Einstellungen". Der Serverport wird auf der Grundlage des angegebenen Protokolls automatisch ausgewählt - 80 für "http://" und 443 für "https://".

Die WebRequest()-Funktion ist synchron, das heißt, sie unterbricht die Ausführung des Programms und wartet auf eine Antwort von dem angefragten Server. Da die Verzögerungen beim Erhalten einer Antwort auf die gesendete Anfrage groß sein können, ist es verboten, die Funktion von Indikatoren aus aufzurufen, denn die Indikatoren arbeiten in einem Thread, der für alle Indikatoren und Charts dieses Symbols gemeinsam ist. Die Verzögerung bei der Ausführung eines Indikators auf einem der Symbolcharts kann die Aktualisierung aller Charts dieses Symbols stoppen.

Die Funktion kann nur von Expert Advisors und Skripts aus aufgerufen werden, denn diese arbeiten in einem eigenen Thread. Wenn die Funktion aus einem Indikator aufgerufen wird, gibt GetLastError() den Fehler 4014 zurück – "Function is not allowed for call" (Die Funktion darf nicht aufgerufen werden.

Die WebRequest()-Funktion kann nicht im Strategietester ausgeführt werden.

Beispiel:

void OnStart()
 { 
   string cookie=NULL,headers;
   char   post[],result[];
   string url="https://finance.yahoo.com";
//--- für die Arbeit mit dem Server muss die URL "https://finance.yahoo.com" 
//--- zur Liste der erlaubten URLs hinzugefügt werden (Hauptmenü->Extras->Optionen, Reiter "Expert Advisors"):
//--- Setzen des Codes des letzten Fehlers auf Null
   ResetLastError();
//--- Herunterladen der HTML-Seite von Yahoo Finance
   int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
   if(res==-1)
    { 
      Print("Fehler in WebRequest. Fehlercode  =",GetLastError());
      //--- kann sein, dass die URL in der Liste nicht vorhanden ist, geben wir eine Meldung aus, dass die URL zur Liste hinzugefügt werden muss
      MessageBox("Die URL '"+url+"' muss zur Liste der erlaubten URLs im Reiter 'Expert Advisors' hinzugefügt werden","Fehler",MB_ICONINFORMATION);
     }
   else
    { 
      if(res==200)
       { 
         //--- Herunterladen erfolgreich
         PrintFormat("Die Datei wurde erfolgreich heruntergeladen, Größe %d Byte.",ArraySize(result));
         //PrintFormat("Headers des Servers: %s",headers);
         //--- Speichern der Daten in einer Datei
         int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
          { 
            //--- Speichern des Inhaltes des Arrays result[] in einer Datei
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- Datei schließen
            FileClose(filehandle);
           }
         else
            Print("Fehler in FileOpen. Fehlercode =",GetLastError());
        }
      else
         PrintFormat("Herunterladen von '%s' fehlgeschlagen, Fehlercode %d",url,res);
     }
  }